package cn.com.surker.production.entity;

import cn.com.surker.base.BaseEntity;
import cn.com.surker.enums.production.invoice.InvoiceSendTypeEnum;
import cn.com.surker.excel.ExcelCell;
import cn.com.surker.util.StringUtils;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;

/**
 * <p>
 * 生产发货单表
 * </p>
 *
 * @author admin
 * @since 2024-07-25
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class ProductionInvoice extends BaseEntity implements Serializable {

	private static final long serialVersionUID = 1L;

	/**
	 * 标识
	 */
	@TableId(value = "id", type = IdType.AUTO)
	private Long id;

	/**
	 * 公司ID
	 */
	private Long orgId;

	/**
	 * 编码
	 */
	@ExcelCell(value = "发货单编号", sort = 1)
	private String code;

	/**
	 * 任务单
	 */
	@NotNull(message = "请选择任务单")
	private Long indentId;

	/**
	 * 发货单类型,关联枚举:InvoiceSendTypeEnum
	 */
	@NotNull(message = "请选择发货类型")
	private Integer invoiceType;

	/**
	 * 生产方式.(0：工控派单，1：手动票，2：空票),关联枚举:InvoiceCreateTypeEnum
	 */
	@NotNull(message = "请选择生产方式")
	private Integer createType;

	/**
	 * 泵送设备,泵送设备是发货单自己的数据
	 * 20250514取消,改为使用link_pump_id和任务单关联泵送设备关联
	 */
	@Deprecated
	@TableField(exist = false)
	private Long pumpDevice;

	/**
	 * 泵送人员
	 */
	@Deprecated
	@TableField(exist = false)
	private String pumpDriver;

	/**
	 * 运距,后面看是否从任务单关联
	 */
	@ExcelCell(value = "运距", sort = 8)
	private Double distance;

	/**
	 * 是否需要过磅,默认0或者null,需要
	 * 2025-04-02废弃,改用从合同关联
	 */
	@Deprecated
	@TableField(exist = false)
	private Integer isWeight;

	/**
	 * 是否累计,默认为0或者null,表示需要累计,
	 * 1表示不需要累计
	 * 2025-03-04取消
	 * 2025-03-13恢复
	 * 2025-05-07改为和发货单状态为一致,不累计为作废
	 */
	private Integer isAdd;

	/**
	 * 生产完成时间
	 */
	@NotNull(message = "请选择生产完成时间")
	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@ExcelCell(value = "生产时间", sort = 0, dateFormat = "YYYY-MM-dd HH:mm:ss")
	private Date proTime;

	/**
	 * 车号
	 */
	@NotNull(message = "请选择运输车辆")
	private Long carId;

	/**
	 * 司机
	 */
	// @NotBlank(message = "请选择司机")
	@ExcelCell(value = "司机", sort = 11)
	private String driver;

	/**
	 * 运输司机
	 */
	private Long driverId;

	/**
	 * 生产线
	 */
	// @NotNull(message = "请选择生产线")
	private Long mixId;

	/**
	 * 调度员
	 */
	@NotNull(message = "请选择调度员")
	private Long dispatcher;

	/**
	 * 调度员名
	 */
	private String dispatcherName;


	/**
	 * 发货方量
	 */
	@NotNull(message = "请输入发货方量")
	@ExcelCell(value = "发货方量", sort = 15, childSort = 1, calcTotal = true)
	private Double sendStere;

	/**
	 * 发货过磅方量,为发货时候的过磅的第一次过磅方量,后续的过磅不操作此字段
	 */
	private Double weightStere;

	/**
	 * 发货单出场过磅的重量(单位KG)
	 */
	private Double weightValue;

	/**
	 * 过磅时间
	 */
	@TableField(exist = false)
	private Double weightTime;

	/**
	 * 拌台操作员,如果是转料操作,则不需要记录拌台操作员
	 */
	// @NotNull(message = "请选择拌台操作员")
	private Long mixUser;

	/**
	 * 拌台操作员名
	 */
	private String mixUserName;

	/**
	 * 打印次数
	 */
	private Integer printNum;

	/**
	 * 是否需要打印
	 * 2025-05-16 作废字段,不需要了
	 */
	@TableField(exist = false)
	private Integer needPrint;

	/**
	 * 道路运输类型,默认为任务单的运输类型
	 * 关联枚举:RoadTypeEnum
	 */
	private Integer roadType;

	/**
	 * 工控机发货单id,如果是转料,则没有
	 * 2024/11/22此数据废弃,发货单与派单为1对多关系,派单和工控机发货单为1对1关系,通过派单表的数据关联工控机发货单
	 * 2025/01/7启用此字段,为erp库中的工控机发货单表(control_invoice)id
	 */
	private Long controlInvoiceId;

	//	2024-10-15新增
	/**
	 * 票据类型,关联枚举ReceiptTypeEnum
	 */
	@TableField(updateStrategy = FieldStrategy.IGNORED)
	private Integer receiptType;

	/**
	 * 特殊结算类型,关联枚举SpecialClearTypeEnum
	 */
	@TableField(updateStrategy = FieldStrategy.IGNORED)
	private Integer specialClearType;

	/**
	 * 是否计算运输方量,0计算;1不计算
	 */
	@TableField(updateStrategy = FieldStrategy.IGNORED)
	private Integer calcTranStere;

	/**
	 * 运输备注
	 */
	@TableField(updateStrategy = FieldStrategy.IGNORED)
	private String tranRemark;

	/**
	 * 发货单生产流程状态,关联枚举InvoiceProcessEnum
	 */
	private Integer process;

	/**
	 * 泵送备注
	 */
	@TableField(updateStrategy = FieldStrategy.IGNORED)
	private String pumpRemark;


	/**
	 * 弹单处理,通过工控机生产的,在生产后,通过调度页面查询是否处理
	 * 1表示需要处理,0表示不需要,默认为0,当工控机写入数据设置为1
	 */
	private Integer popUp;

	/**
	 * 是否经过超限站
	 */
	private Integer overLimit;

	/**
	 * 工控机对接备注
	 */
	private String controlRemark;

	public void addControlRemark(String value) {
		if (StringUtils.isBlank(this.controlRemark)) {
			this.controlRemark = value;
		} else {
			this.controlRemark += ";" + value;
		}
	}

	public void initCode(String orgCode) {
		String prefix = "F" + orgCode;
		String invCode = super.baseInitCode(prefix);
		this.code = invCode;
	}

	/**
	 * 用于同步老erp的数据
	 */
	@Deprecated
	private Long erpId;

	@ExcelCell(value = "累计车次", sort = 12)
	private Integer totalCar;

	@ExcelCell(value = "累计方量", sort = 13)
	private Double totalStere;

	/**
	 * 关联任务单泵送设备表id,标识发货单所用的浇筑方式,泵送设备,
	 * 默认的是production_indent_pump表的第一条数据
	 */
	private Long linkPumpId;

}
